# -*- coding: utf-8 -*-

"""
人脸识别考勤系统主窗口
"""
import os
import sys
import time

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (QMainWindow, QLabel, QVBoxLayout, QHBoxLayout, QPushButton,
                             QDialog, QLineEdit, QMessageBox)

from employee_list_widget import EmployeeListWidget


class UiMainWindow:
    """UI界面设置类"""

    def setupUi(self, main_window):
        # 窗口基本设置
        main_window.setObjectName("MainWindow")
        main_window.setWindowTitle("人脸识别考勤系统")

        # 中央部件作为main_window的子组件，main_window是应用窗口
        # 这里作为UiMainWindow的属性，为了再其他方法中快速绑定下级组件用的
        self.centralWidget = QtWidgets.QWidget(main_window)
        self.centralWidget.setObjectName("centralWidget")
        main_window.setCentralWidget(self.centralWidget)

        # 主垂直布局, 注意是Q-V-BoxLayout，内部组件竖向排列
        main_vertical_layout = QtWidgets.QVBoxLayout(self.centralWidget)
        # 布局与容器边界之间的空间  左上右下
        main_vertical_layout.setContentsMargins(0, 0, 0, 0)
        # 布局内各组件之间的空间
        main_vertical_layout.setSpacing(0)

        # 创建顶部区域
        self._create_top_area(main_vertical_layout)

        # 创建主体区域
        self._create_main_body_area(main_vertical_layout)

    def _create_top_area(self, main_layout):
        # 顶部容器
        top_widget = QtWidgets.QWidget(self.centralWidget)
        top_widget.setObjectName("top_widget")
        top_widget.setStyleSheet("""
            QWidget#top_widget {
                border-bottom: 1px solid #24b7e7;
            }
        """)
        top_widget.setFixedHeight(100)  # 固定高度

        # 顶部布局， Q-H-BoxLayout 水平布局
        top_layout = QtWidgets.QHBoxLayout(top_widget)
        top_layout.setContentsMargins(20, 10, 20, 10)
        top_layout.setSpacing(15)

        # 系统标题
        self.system_title = QtWidgets.QLabel()
        self.system_title.setObjectName("system_title")
        self.system_title.setText("人脸识别考勤系统")
        self.system_title.setStyleSheet("""
            QLabel#system_title {
                font: bold 36pt "微软雅黑";
                color: #24b7e7;
            }
        """)
        top_layout.addWidget(self.system_title)

        # 添加弹簧元素  [部件A] <------ 弹性空间 ------> [部件B]
        # layout.addStretch(1)  # 权重=1
        # layout.addWidget(A)   # 无特别设置
        # layout.addStretch(2)  # 权重=2
        # 当有额外空间时：
        # 第一个空白区获得 1/(1+2)=33% 的空间
        # 第二个空白区获得 2/(1+2)=67% 的空间
        top_layout.addStretch(1)

        # 时间显示区域
        time_display = QtWidgets.QFrame()
        time_layout = QtWidgets.QVBoxLayout(time_display)
        time_layout.setContentsMargins(0, 0, 0, 0)
        time_layout.setSpacing(0)

        # 日期显示
        self.label_top_date = QtWidgets.QLabel()
        self.label_top_date.setObjectName("label_top_date")
        self.label_top_date.setStyleSheet("""
            QLabel#label_top_date {
                font: 14pt "Arial";
                color: #7fc1ff;
                padding-bottom: 5px;
            }
        """)

        # label_top_date和label_top_time 是垂直日期和时间两个label，两个右对齐
        self.label_top_date.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)

        # 时间显示
        self.label_top_time = QtWidgets.QLabel()
        self.label_top_time.setObjectName("label_top_time")
        self.label_top_time.setStyleSheet("""
            QLabel#label_top_time {
                font: bold 26pt "Arial";
                color: white;
            }
        """)
        self.label_top_time.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)

        time_layout.addWidget(self.label_top_date)
        time_layout.addWidget(self.label_top_time)
        top_layout.addWidget(time_display)
        # 管理按钮
        self.admin_btn = QPushButton("管理")
        self.admin_btn.setObjectName("admin_btn")
        self.admin_btn.setStyleSheet("""
                   QPushButton#admin_btn {
                       background-color: rgba(36, 183, 231, 0.3);
                       color: white;
                       font: bold 16pt "微软雅黑";
                       padding: 8px 16px;
                       border-radius: 8px;
                       border: 1px solid #24b7e7;
                   }
                   QPushButton#admin_btn:hover {
                       background-color: rgba(36, 183, 231, 0.5);
                   }
                   QPushButton#admin_btn:pressed {
                       background-color: rgba(36, 183, 231, 0.7);
                   }
               """)
        top_layout.addWidget(self.admin_btn)
        # 添加到主布局
        main_layout.addWidget(top_widget)

    def _create_main_body_area(self, main_layout):
        """创建主体区域 - 包含左右两部分"""
        # 主体容器
        body_widget = QtWidgets.QWidget()
        body_widget.setObjectName("body_widget")

        # 水平布局 - 左视频右签到
        body_layout = QtWidgets.QHBoxLayout(body_widget)
        body_layout.setContentsMargins(15, 15, 15, 15)
        body_layout.setSpacing(20)

        # 左侧视频区域
        self._create_left_video_area(body_layout)

        # 右侧用户信息区域
        self._create_right_user_info(body_layout)

        # 管理界面区域（初始隐藏）
        self._create_admin_area(body_layout)

        # 添加到主布局
        main_layout.addWidget(body_widget, 1)  # 填满剩余空间

    def _create_left_video_area(self, body_layout):
        """创建左侧视频区域"""
        # 视频容器
        self.video_container = QtWidgets.QFrame()
        self.video_container.setStyleSheet("""
            QFrame {
                border-radius: 15px;
                border: 1px solid #24b7e7;
            }
        """)
        self.video_container.setObjectName("video_container")

        # 视频区域布局
        video_layout = QtWidgets.QVBoxLayout(self.video_container)
        video_layout.setContentsMargins(10, 10, 10, 10)
        video_layout.setSpacing(10)

        # 视频显示标签
        self.video_label = QtWidgets.QLabel()
        self.video_label.setAlignment(QtCore.Qt.AlignCenter)
        self.video_label.setStyleSheet("""
            QLabel {
                border: 1px solid #3a506b;
                border-radius: 5px;
            }
        """)
        video_layout.addWidget(self.video_label)

        # 添加到主体布局
        body_layout.addWidget(self.video_container, 3)  # 宽度占3/4

    def _create_right_user_info(self, body_layout):
        """创建右侧签到成功后的用户信息区域"""
        # 右侧容器
        self.user_container = QtWidgets.QFrame()
        self.user_container.setObjectName("user_container")
        self.user_container.setStyleSheet("""
            QFrame#user_container {
                background-color: rgba(30, 30, 70, 0.8);
                border-radius: 15px;
                border: 1px solid #24b7e7;
            }
        """)
        self.user_container.setMinimumWidth(500)
        self.user_container.setMinimumHeight(500)
        # 使用垂直布局包装主要内容，使其可以居中
        container_layout = QtWidgets.QVBoxLayout(self.user_container)
        container_layout.setContentsMargins(25, 25, 25, 25)
        container_layout.setSpacing(0)

        # 添加顶部弹簧（使内容整体居中）
        container_layout.addStretch(1)

        # 创建用户信息内容的主容器
        content_widget = QtWidgets.QWidget()
        container_layout.addWidget(content_widget)

        # 添加底部弹簧（使内容整体居中）
        container_layout.addStretch(1)

        # 内容区域使用垂直布局
        content_layout = QtWidgets.QVBoxLayout(content_widget)
        content_layout.setContentsMargins(0, 0, 0, 0)
        content_layout.setSpacing(30)  # 固定照片和文字之间的间距

        # 用户头像区域
        avatar_frame = QtWidgets.QFrame()
        avatar_layout = QtWidgets.QVBoxLayout(avatar_frame)
        avatar_layout.setContentsMargins(0, 0, 0, 0)
        avatar_layout.setSpacing(0)
        avatar_layout.setAlignment(QtCore.Qt.AlignCenter)

        # 头像容器
        self.avatar_container = QtWidgets.QLabel()
        self.avatar_container.setFixedSize(180, 180)
        self.avatar_container.setStyleSheet("""
            QLabel {
                border: 3px solid #24b7e7;
            }
        """)
        # 设置头像默认占位符
        self.avatar_container.setAlignment(QtCore.Qt.AlignCenter)
        avatar_layout.addWidget(self.avatar_container)
        content_layout.addWidget(avatar_frame)

        # 用户信息区域
        info_frame = QtWidgets.QFrame()
        info_layout = QtWidgets.QVBoxLayout(info_frame)
        info_layout.setSpacing(10)
        info_layout.setContentsMargins(0, 0, 0, 0)
        info_layout.setAlignment(QtCore.Qt.AlignCenter)

        # 用户名
        self.user_name = QtWidgets.QLabel("张三")
        self.user_name.setObjectName("user_name")
        self.user_name.setStyleSheet("""
            QLabel#user_name {
                font: bold 25pt "微软雅黑";
                color: #e2f7ff;
                text-align: center;
            }
        """)
        self.user_name.setAlignment(QtCore.Qt.AlignCenter)
        info_layout.addWidget(self.user_name)

        # 员工ID
        self.user_id = QtWidgets.QLabel("工号: IT2023001")
        self.user_id.setObjectName("user_id")
        self.user_id.setStyleSheet("""
            QLabel#user_id {
                font: 20pt "微软雅黑";
                color: #7fc1ff;
                text-align: center;
            }
        """)
        self.user_id.setAlignment(QtCore.Qt.AlignCenter)
        info_layout.addWidget(self.user_id)

        # 签到时间
        self.sign_time = QtWidgets.QLabel("签到时间: 09:15")
        self.sign_time.setObjectName("sign_time")
        self.sign_time.setStyleSheet("""
            QLabel#sign_time {
                font: 20pt "微软雅黑";
                color: #5ce1b6;
                text-align: center;
            }
        """)
        self.sign_time.setAlignment(QtCore.Qt.AlignCenter)
        info_layout.addWidget(self.sign_time)

        # 签到状态
        self.sign_status = QtWidgets.QLabel("签到成功!")
        self.sign_status.setObjectName("sign_status")
        self.sign_status.setStyleSheet("""
            QLabel#sign_status {
                font: bold 20pt "微软雅黑";
                color: #5ce1b6;
                text-align: center;
            }
        """)
        self.sign_status.setAlignment(QtCore.Qt.AlignCenter)
        info_layout.addWidget(self.sign_status)

        content_layout.addWidget(info_frame)

        # 添加到主体布局
        body_layout.addWidget(self.user_container, 1)  # 宽度占1/4

    def _create_admin_area(self, body_layout):
        """创建管理界面区域（初始隐藏）"""
        # 管理容器
        self.admin_container = QtWidgets.QFrame()
        self.admin_container.setObjectName("admin_container")
        self.admin_container.setStyleSheet("""
            QFrame#admin_container {
                border-radius: 15px;
                border: 1px solid #24b7e7;
            }
        """)
        self.admin_container.hide()  # 初始隐藏

        # 垂直布局
        admin_layout = QtWidgets.QVBoxLayout(self.admin_container)
        admin_layout.setContentsMargins(15, 15, 15, 15)
        admin_layout.setSpacing(15)

        # 创建员工列表控件
        self.employee_list_widget = EmployeeListWidget(self)
        admin_layout.addWidget(self.employee_list_widget)

        # 添加到主体布局
        body_layout.addWidget(self.admin_container, 1)  # 宽度占1/4


class PasswordDialog(QDialog):
    """密码输入对话框"""

    def __init__(self, parent=None):
        super(PasswordDialog, self).__init__(parent)
        self.setWindowTitle("管理员验证")
        # self.setFixedSize(400, 200)
        self.setContentsMargins(10, 20, 20, 10)
        layout = QVBoxLayout(self)
        layout.setSpacing(20)
        # 提示文本
        label = QLabel("请输入管理员密码:")
        label.setStyleSheet("font: bold 18pt '微软雅黑'; color: #24b7e7;")
        layout.addWidget(label)

        # 密码输入框
        self.password_input = QLineEdit()
        self.password_input.setEchoMode(QLineEdit.Password)
        self.password_input.setStyleSheet("""
            QLineEdit {
                font: 16pt "微软雅黑";
                padding: 10px;
                border: 2px solid #24b7e7;
                border-radius: 8px;
            }
        """)
        layout.addWidget(self.password_input)

        # 按钮布局
        button_layout = QHBoxLayout()

        # 确定按钮
        self.confirm_btn = QPushButton("确定")
        self.confirm_btn.setStyleSheet("""
            QPushButton {
                background-color: rgba(36, 183, 231, 0.3);
                color: white;
                font: bold 16pt "微软雅黑";
                padding: 8px 16px;
                border-radius: 8px;
                border: 1px solid #24b7e7;
            }
            QPushButton:hover {
                background-color: rgba(36, 183, 231, 0.5);
            }
            QPushButton:pressed {
                background-color: rgba(36, 183, 231, 0.7);
            }
        """)
        button_layout.addWidget(self.confirm_btn)

        # 取消按钮
        self.cancel_btn = QPushButton("取消")
        self.cancel_btn.setStyleSheet("""
            QPushButton {
                background-color: rgba(150, 150, 150, 0.3);
                color: white;
                font: bold 16pt "微软雅黑";
                padding: 8px 16px;
                border-radius: 8px;
                border: 1px solid #999999;
            }
            QPushButton:hover {
                background-color: rgba(150, 150, 150, 0.5);
            }
            QPushButton:pressed {
                background-color: rgba(150, 150, 150, 0.7);
            }
        """)
        button_layout.addWidget(self.cancel_btn)

        layout.addLayout(button_layout)

        # 连接信号
        self.confirm_btn.clicked.connect(self.accept)
        self.cancel_btn.clicked.connect(self.reject)


class MainWindow(QMainWindow, UiMainWindow):
    """
    主窗口类
    """

    def __init__(self, parent=None):
        # QMainWindow的构造函数
        super(MainWindow, self).__init__(parent)
        # UiMainWindow继承的方法
        self.setupUi(self)

        # 初始化定时器（每分钟更新一次）
        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.update_time)
        self.timer.start(1000)  # 每分钟（60秒 * 1000毫秒）更新一次

        # 立即更新一次时间
        self.update_time()

        # 设置默认用户信息（签到时间也只显示到分钟）
        self.set_user_info("张三", "IT2023001", "09:15")
        self.set_user_avatar('./avatars/avatar_20250812_191934.jpg')

        # 连接管理按钮信号
        self.admin_btn.clicked.connect(self.show_admin_login)

        # 连接返回按钮信号
        self.employee_list_widget.back_btn.clicked.connect(self.switch_to_user_view)

    def set_user_info(self, name, user_id, sign_time):
        """设置用户信息（sign_time格式为 'HH:MM'）"""
        self.user_name.setText(name)
        self.user_id.setText(f"工号: {user_id}")
        self.sign_time.setText(f"签到时间: {sign_time}")

    def set_user_avatar(self, image_path):
        """设置用户头像(方形显示)

        :param image_path: 头像图片的本地路径
        """
        if not os.path.exists(image_path):
            print(f"头像文件不存在: {image_path}")
            return

        # 加载头像图片
        pixmap = QtGui.QPixmap(image_path)
        if pixmap.isNull():
            print(f"无效的头像文件: {image_path}")
            return

        # 移除边框
        # self.avatar_container.setStyleSheet("")

        # 等比例缩放图片，保持宽高比
        scaled = pixmap.scaled(
            180, 180,
            QtCore.Qt.KeepAspectRatio,
            QtCore.Qt.SmoothTransformation
        )

        # 设置头像
        self.avatar_container.setPixmap(scaled)

    def update_time(self):
        """更新当前时间（每分钟更新一次）"""
        current_time = time.localtime()

        # 将英文星期转换为中文
        weekday_mapping = {
            'Monday': '星期一',
            'Tuesday': '星期二',
            'Wednesday': '星期三',
            'Thursday': '星期四',
            'Friday': '星期五',
            'Saturday': '星期六',
            'Sunday': '星期日'
        }
        en_weekday = time.strftime("%A", current_time)
        zh_weekday = weekday_mapping.get(en_weekday, en_weekday)

        # 格式化日期字符串（包含中文星期）
        date_str = time.strftime("%Y年%m月%d日", current_time) + f" {zh_weekday}"
        time_str = time.strftime("%H:%M:%S", current_time)  # 只显示到分钟

        # 更新日期和时间显示
        self.label_top_date.setText(date_str)
        self.label_top_time.setText(time_str)

    def show_admin_login(self):
        """显示管理员登录对话框"""
        dialog = PasswordDialog(self)
        if dialog.exec_() == QDialog.Accepted:
            password = dialog.password_input.text()
            # 验证密码（实际应用中应使用更安全的验证方式）
            if password == "admin123":
                self.switch_to_admin_view()
            else:
                QMessageBox.warning(self, "密码错误", "您输入的管理员密码不正确！", QMessageBox.Ok)

    def switch_to_admin_view(self):
        """切换到管理界面"""
        self.user_container.hide()
        self.admin_container.show()
        # 确保管理按钮处于选中状态
        self.admin_btn.setStyleSheet("""
            QPushButton#admin_btn {
                background-color: rgba(36, 183, 231, 0.7);
                color: white;
                font: bold 16pt "微软雅黑";
                padding: 8px 16px;
                border-radius: 8px;
                border: 1px solid #24b7e7;
            }
        """)

    def switch_to_user_view(self):
        """切换回用户信息界面"""
        self.admin_container.hide()
        self.user_container.show()
        # 还原管理按钮的样式
        self.admin_btn.setStyleSheet("""
            QPushButton#admin_btn {
                background-color: rgba(36, 183, 231, 0.3);
                color: white;
                font: bold 16pt "微软雅黑";
                padding: 8px 16px;
                border-radius: 8px;
                border: 1px solid #24b7e7;
            }
            QPushButton#admin_btn:hover {
                background-color: rgba(36, 183, 231, 0.5);
            }
            QPushButton#admin_btn:pressed {
                background-color: rgba(36, 183, 231, 0.7);
            }
        """)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)

    # 设置全局样式
    # 影响了dialog窗口的颜色
    app.setStyle("Fusion")
    palette = QtGui.QPalette()
    palette.setColor(QtGui.QPalette.Window, QtGui.QColor(10, 20, 40))
    palette.setColor(QtGui.QPalette.WindowText, QtGui.QColor(200, 220, 255))
    app.setPalette(palette)

    # 创建主窗口
    window = MainWindow()
    # 设置窗口最大化
    window.showMaximized()
    window.show()

    sys.exit(app.exec_())
